package com.jnshu.tools.binding;

import java.util.Random;

/**
 * @author Martin
 * @date 2019/8/9 21:16
 */
public class RandomCode {
    /**方法一
     * 用math.random()实现，比较麻烦的一种方式，思路是：math.random()生成的是[0.0, 1.0)的伪随机数，
     * 如果当前值是0.9...，则直接*1000000返回，其他情况可能生成0.8...，0.03...，0.0003...，
     * 这些情况都*1000000，但是结果可能是6位，5位，4位都有可能，那么再加上100000，肯定就保证是6位了
     */
    public static int randomOne() {
        int intFlag = (int) (Math.random() * 1000000);
        String flag = String.valueOf(intFlag);
        if (flag.length() == 6 && flag.substring(0, 1).equals("9")) {
            System.out.println(intFlag);
            return intFlag;
        } else {
            intFlag = intFlag + 100000;
            System.out.println(intFlag);
            return intFlag;
        }
    }

    /**方法二
     * random.nextInt(10)意思是返回大于等于0，小于10的一个正整数，
     * 既然是生成6位随机数，每个数一定是0-9之内的，我循环6次，
     * 每次从0-9随机选取一个数字拼接字符串返回，不就行了
     */
    public static String randomTwo(){
        Random random = new Random();
        String result = "";
        for (int i = 0; i<6; i++){
            result += random.nextInt(10);
        }
        return result;
    }

    /**方法三
     * random.nextInt(10)知道是什么意思了，最大的6位数是999999，最小的六位数是100000
     */
    public static int randomThree(){
        int flag = new Random().nextInt(999999);
        if (flag < 100000){
            flag += 100000;
        }
        return flag;
    }

    /**方法四
     * 引入了一个source字符串，从这个字符串里可以随机生成一个子串返回，
     * 很多pc网站用这个方法生成带字母数字的验证码，原理类似方法二
     */
    public static String randomFour(){
        String sources = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random random = new Random();
        StringBuffer flag = new StringBuffer();
        for (int i = 0; i < 6; i++){
            flag.append(sources.charAt(random.nextInt(62))+"");
        }
        return flag.toString();
    }
}
